﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.SqlClient;
using System.Drawing;

namespace AccesoBD
{
    public class Pacientess
    {
        public static bool VerificarExistenciaDePaciente(long documento)
        {
            SqlConnection con = null;
            bool existencia = false;
            try
            {
                con = DB.Conectar();

                string comando = "select * from Persona where nroDocumento=@doc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@doc", documento));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    existencia = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al verificar paciente", Ex);
            }
            finally
            {

                con.Close();
            }

            return existencia;

        }
        //janet
        public static Paciente VerificarExistenciaDePaciente(long documento, int codTipoDoc)
        {
            SqlConnection con = null;

            Paciente p = null;

            try
            {
                con = DB.Conectar();

                string comando = "SELECT Persona.nombre, Persona.apellido, Persona.tipoDocumento, Persona.nroDocumento, Persona.telefono, Persona.mail, Persona.fechaNacimiento, Paciente.nroHC, Paciente.idPersona "
                                + "FROM  Paciente INNER JOIN Persona ON Paciente.idPersona = Persona.codPersona "
                                + "WHERE (Persona.tipoDocumento = @tipoDoc) AND (Persona.nroDocumento = @nroDoc)";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nroDoc", documento));
                listp.Add(new SqlParameter("@tipoDoc", codTipoDoc));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                while (dr.Read())
                {
                    p = new Paciente();
                    p.nroHC = Convert.ToInt64(dr["nroHC"].ToString());
                    p.idPersona = Convert.ToInt64(dr["idPersona"].ToString());
                    p.Apellido = Convert.ToString(dr["apellido"].ToString());
                    p.Nombre = Convert.ToString(dr["nombre"].ToString());
                    p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                    p.NroDocumento = Convert.ToInt64(dr["nroDocumento"].ToString());
                    p.FechaNacimiento = Convert.ToDateTime(dr["fechaNacimiento"].ToString());
                    if (dr["telefono"] == DBNull.Value)
                    { p.Telefono = null; }
                    else p.Telefono = Convert.ToInt64(dr["telefono"].ToString());
                    if (dr["mail"] == DBNull.Value)
                        p.Mail = null;
                    else p.Mail = Convert.ToString(dr["mail"].ToString());
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al verificar paciente", Ex);
            }
            finally
            {
                con.Close();
            }
            return p;
        }

        public static long ObtenerUltimoIDHistoriaClinica()
        {
            SqlConnection con = DB.Conectar();
            long id = 0;
            SqlTransaction tran = null;
            try
            {

                tran = con.BeginTransaction();

                string comando = "select Max(nroHC) from Historia_Clinica";
                List<SqlParameter> listp = new List<SqlParameter>();
                string nroHc = DB.EjecutarScalar(comando, listp, con, tran);
                if (!nroHc.Equals(""))
                {//Tener en cuenta si retorna siempre null. Siempre retornaria cero
                    id = long.Parse(nroHc.ToString());

                }
                tran.Commit();

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("Error al obtener ultimo Id del Paciente", Ex);
            }
            finally
            {
                con.Close();

            }

            return id;
        }

        public static long ObtenerUltimoIDPersona(SqlTransaction tran, SqlConnection con)
        {
            long id = 0;

            try
            {



                string comando = "select Max(codPersona) from Persona";
                List<SqlParameter> listp = new List<SqlParameter>();
                id = long.Parse(DB.EjecutarScalar(comando, listp, con, tran));
                if (id > 0)
                {
                    return id;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al obtener ultimo Id de la Persona", Ex);
            }

            return id;
        }

        public static int registrarPaciente(Paciente P, Domicilio oD, List<ObraSocialXPaciente> ListoSxP)
        {

            int resultado = 0;
            SqlConnection con = null;
            SqlTransaction tran = null;
            con = DB.Conectar();
            try
            {
                tran = con.BeginTransaction();

                //REGISTRAMOS PERSONA
                string comando = "insert into Persona (nombre,apellido,tipoDocumento,nroDocumento,telefono,celular,mail,sexo,fechaNacimiento) values(@nombre,@apellido,@tipoDocumento,@nroDocumento,@telefono,@celular,@mail,@sexo,@fechaNacimiento)  ";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", P.Nombre));
                listp.Add(new SqlParameter("@apellido", P.Apellido));
                listp.Add(new SqlParameter("@tipoDocumento", P.CodTipoDoc));
                listp.Add(new SqlParameter("@nroDocumento", P.NroDocumento));
                listp.Add(new SqlParameter("@fechaNacimiento", P.FechaNacimiento));
                listp.Add(new SqlParameter("@sexo", P.CodSexo));

                //PARAMETROS QUE PUEDEN RECIBIR NULL

                if (P.Telefono == null)
                {
                    listp.Add(new SqlParameter("@telefono", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@telefono", P.Telefono));
                }

                if (P.Celular == null)
                {
                    listp.Add(new SqlParameter("@celular", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@celular", P.Celular));
                }
                if (P.Mail == null)
                {
                    listp.Add(new SqlParameter("@mail", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@mail", P.Mail));
                }

                resultado = DB.EjecutarCommand(comando, listp, con, tran);

                if (resultado > 0)
                {
                    P.idPersona = ObtenerUltimoIDPersona(tran, con);
                    //REGISTRAMOS DOMICILIO
                    comando = "insert into Domicilio (calle, numero, idBarrio, piso, departamento,codigoPostal) values(@calle, @numero, @idBarrio,@piso,@departamento,@codigoPostal)";
                    listp = null;
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@calle", oD.calle));
                    listp.Add(new SqlParameter("@numero", oD.numero));
                    listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                    if (oD.piso == null)
                    {
                        listp.Add(new SqlParameter("@Piso", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@Piso", oD.piso));
                    }
                    if (oD.Departamento == null)
                    {
                        listp.Add(new SqlParameter("@departamento", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@departamento", oD.Departamento));

                    }
                    if (oD.codPostal == null)
                    {
                        listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                    }
                    resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    if (resultado > 0)
                    {
                        P.idDomicilio = Domicilios.ObtenerUltimoIDDomicilio(tran, con);
                        //REGISTRAMOS HISTORIAL DE INGRESO

                        //comando = "insert into Historial_Ingreso (fechaAlta) values (@fechaAlta) ";
                        //listp = null;
                        //listp = new List<SqlParameter>();
                        //listp.Add(new SqlParameter("@fechaAlta", DateTime.Now));
                        //resultado = DB.EjecutarCommand(comando, listp, con, tran);

                        if (resultado > 0)
                        {
                            //REGISTRAMOS LA HISTORIA CLINICA
                            comando = "insert into Historia_Clinica (fechaCreacion) values (@fechaCreacion) ";
                            listp = null;
                            listp = new List<SqlParameter>();
                            listp.Add(new SqlParameter("@fechaCreacion", DateTime.Now));
                            resultado = DB.EjecutarCommand(comando, listp, con, tran);

                            if (resultado > 0)
                            {


                                //REGISTRAMOS PACIENTE
                                //P.nroHistorialIngreso = HistorialesDeIngreso.ObtenerUltimoIdHistorialIngreso(con, tran);
                                P.nroHistorialIngreso = null;
                                P.nroHC = Historiales_Clinicos.ObtenerUltimaHistoriaClinica(con, tran);
                                comando = "insert into Paciente (nroHC,idPersona, idTipoPaciente, nroAfiliado, idHistorialIngreso, idEstadoPaciente,idDomicilio, foto) values(@nroHC,@idPersona,@idTipoPaciente, @nroAfiliado, @idHistorialIngreso, @idEstadoPaciente,@idDomicilio, @foto) ";
                                SqlCommand cmd = new System.Data.SqlClient.SqlCommand(comando, con);

                                cmd.Parameters.Add("@nroHC", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idPersona", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idTipoPaciente", System.Data.SqlDbType.Int);

                                cmd.Parameters.Add("@idHistorialIngreso", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idEstadoPaciente", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idDomicilio", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@nroAfiliado", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@foto", System.Data.SqlDbType.Image);

                                cmd.Parameters["@nroHC"].Value = P.nroHC;
                                cmd.Parameters["@idPersona"].Value = P.idPersona;
                                cmd.Parameters["@idTipoPaciente"].Value = P.idTipoPaciente;
                                cmd.Parameters["@idHistorialIngreso"].Value = DBNull.Value;
                                cmd.Parameters["@idEstadoPaciente"].Value = P.idEstadoPaciente;
                                cmd.Parameters["@idDomicilio"].Value = P.idDomicilio;
                                if (P.nroAfiliado != null)
                                {
                                    cmd.Parameters["@nroAfiliado"].Value = P.nroAfiliado;
                                }
                                else
                                {
                                    cmd.Parameters["@nroAfiliado"].Value = DBNull.Value;
                                }

                                if (P.foto == null)
                                {
                                    cmd.Parameters["@foto"].Value = DBNull.Value;
                                }
                                else
                                {

                                    // Asignando el valor de la imagen
                                    // Stream usado como buffer
                                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                                    // Se guarda la imagen en el buffer
                                    P.foto.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                                    // Se extraen los bytes del buffer para asignarlos como valor para el parámetro.
                                    cmd.Parameters["@foto"].Value = ms.GetBuffer();
                                }

                                cmd.Transaction = tran;

                                resultado = cmd.ExecuteNonQuery();

                                if (resultado > 0)
                                {
                                    if (ListoSxP.Count > 0)
                                    {
                                        comando = "insert into ObraSocialXPaciente(nroHCpaciente,idPersonaPaciente,idObraSocial,nroAfiliadoOS)values(@nroHCpaciente,@idPersonaPaciente,@idObraSocial,@nroAfiliadoOS)";
                                        foreach (ObraSocialXPaciente item in ListoSxP)
                                        {

                                            listp = new List<SqlParameter>();
                                            listp.Add(new SqlParameter("@nroHCpaciente", P.nroHC));
                                            listp.Add(new SqlParameter("@idPersonaPaciente", P.idPersona));
                                            listp.Add(new SqlParameter("@idObraSocial", item.idObraSocial));
                                            listp.Add(new SqlParameter("@nroAfiliadoOS", item.nroAfiliado));

                                            resultado = DB.EjecutarCommand(comando, listp, con, tran);

                                            listp = null;
                                        }
                                        if (resultado > 0)
                                        {
                                            //cargamos en la tabla paciente que SI tiene OS
                                            comando = "update Paciente set tieneOS = @tieneOS where idPersona = @idPersona and nroHC = @nroHC";
                                            SqlCommand sqlcmd = new SqlCommand(comando, con);
                                            sqlcmd.Parameters.Add(new SqlParameter("@tieneOS", true));
                                            sqlcmd.Parameters.Add(new SqlParameter("@idPersona", P.idPersona));
                                            sqlcmd.Parameters.Add(new SqlParameter("@nroHC", P.nroHC));
                                            sqlcmd.Transaction = tran;
                                            sqlcmd.ExecuteNonQuery();

                                            tran.Commit();
                                        }
                                    }
                                    else
                                    {
                                        //cargamos que no tiene OS
                                        comando = "update Paciente set tieneOS = @tieneOS where idPersona = @idPersona and nroHC = @nroHC";
                                        SqlCommand sqlcmd = new SqlCommand(comando, con);
                                        sqlcmd.Parameters.Add(new SqlParameter("@tieneOS", false));
                                        sqlcmd.Parameters.Add(new SqlParameter("@idPersona", P.idPersona));
                                        sqlcmd.Parameters.Add(new SqlParameter("@nroHC", P.nroHC));
                                        sqlcmd.Transaction = tran;
                                        sqlcmd.ExecuteNonQuery();

                                        tran.Commit();
                                    }

                                }

                            }
                        }

                    }
                }

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("No se pudo registrar el Paciente", Ex);
            }

            finally
            {

                con.Close();
            }

            return resultado;

        }

        public static int registrarPaciente(Paciente P, Domicilio oD)
        {

            int resultado = 0;
            SqlConnection con = null;
            SqlTransaction tran = null;
            con = DB.Conectar();
            try
            {
                tran = con.BeginTransaction();

                //REGISTRAMOS PERSONA
                string comando = "insert into Persona (nombre,apellido,tipoDocumento,nroDocumento,telefono,celular,mail,sexo,fechaNacimiento) values(@nombre,@apellido,@tipoDocumento,@nroDocumento,@telefono,@celular,@mail,@sexo,@fechaNacimiento)  ";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", P.Nombre));
                listp.Add(new SqlParameter("@apellido", P.Apellido));
                listp.Add(new SqlParameter("@tipoDocumento", P.CodTipoDoc));
                listp.Add(new SqlParameter("@nroDocumento", P.NroDocumento));
                listp.Add(new SqlParameter("@fechaNacimiento", P.FechaNacimiento));
                listp.Add(new SqlParameter("@sexo", P.CodSexo));

                //PARAMETROS QUE PUEDEN RECIBIR NULL

                if (P.Telefono == null)
                {
                    listp.Add(new SqlParameter("@telefono", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@telefono", P.Telefono));
                }

                if (P.Celular == null)
                {
                    listp.Add(new SqlParameter("@celular", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@celular", P.Celular));
                }
                if (P.Mail == null)
                {
                    listp.Add(new SqlParameter("@mail", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@mail", P.Mail));
                }

                resultado = DB.EjecutarCommand(comando, listp, con, tran);

                if (resultado > 0)
                {
                    P.idPersona = ObtenerUltimoIDPersona(tran, con);
                    //REGISTRAMOS DOMICILIO
                    comando = "insert into Domicilio (calle, numero, idBarrio, piso, departamento,codigoPostal) values(@calle, @numero, @idBarrio,@piso,@departamento,@codigoPostal)";
                    listp = null;
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@calle", oD.calle));
                    listp.Add(new SqlParameter("@numero", oD.numero));
                    listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                    if (oD.piso == null)
                    {
                        listp.Add(new SqlParameter("@Piso", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@Piso", oD.piso));
                    }
                    if (oD.Departamento == null)
                    {
                        listp.Add(new SqlParameter("@departamento", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@departamento", oD.Departamento));

                    }
                    if (oD.codPostal == null)
                    {
                        listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                    }
                    resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    if (resultado > 0)
                    {
                        P.idDomicilio = Domicilios.ObtenerUltimoIDDomicilio(tran, con);
                        //REGISTRAMOS HISTORIAL DE INGRESO

                        //comando = "insert into Historial_Ingreso (fechaAlta) values (@fechaAlta) ";
                        //listp = null;
                        //listp = new List<SqlParameter>();
                        //listp.Add(new SqlParameter("@fechaAlta", DateTime.Now));
                        //resultado = DB.EjecutarCommand(comando, listp, con, tran);

                        if (resultado > 0)
                        {
                            //REGISTRAMOS LA HISTORIA CLINICA
                            comando = "insert into Historia_Clinica (fechaCreacion) values (@fechaCreacion) ";
                            listp = null;
                            listp = new List<SqlParameter>();
                            listp.Add(new SqlParameter("@fechaCreacion", DateTime.Now));
                            resultado = DB.EjecutarCommand(comando, listp, con, tran);

                            if (resultado > 0)
                            {


                                //REGISTRAMOS PACIENTE
                                //P.nroHistorialIngreso = HistorialesDeIngreso.ObtenerUltimoIdHistorialIngreso(con, tran);
                                P.nroHistorialIngreso = null;
                                P.nroHC = Historiales_Clinicos.ObtenerUltimaHistoriaClinica(con, tran);
                                comando = "insert into Paciente (nroHC,idPersona, idTipoPaciente, nroAfiliado, idHistorialIngreso, idEstadoPaciente,idDomicilio, foto) values(@nroHC,@idPersona,@idTipoPaciente, @nroAfiliado, @idHistorialIngreso, @idEstadoPaciente,@idDomicilio, @foto) ";
                                SqlCommand cmd = new System.Data.SqlClient.SqlCommand(comando, con);

                                cmd.Parameters.Add("@nroHC", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idPersona", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idTipoPaciente", System.Data.SqlDbType.Int);

                                cmd.Parameters.Add("@idHistorialIngreso", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idEstadoPaciente", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@idDomicilio", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@nroAfiliado", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@foto", System.Data.SqlDbType.Image);

                                cmd.Parameters["@nroHC"].Value = P.nroHC;
                                cmd.Parameters["@idPersona"].Value = P.idPersona;
                                cmd.Parameters["@idTipoPaciente"].Value = P.idTipoPaciente;
                                cmd.Parameters["@idHistorialIngreso"].Value = DBNull.Value;
                                cmd.Parameters["@idEstadoPaciente"].Value = P.idEstadoPaciente;
                                cmd.Parameters["@idDomicilio"].Value = P.idDomicilio;
                                if (P.nroAfiliado != null)
                                {
                                    cmd.Parameters["@nroAfiliado"].Value = P.nroAfiliado;
                                }
                                else
                                {
                                    cmd.Parameters["@nroAfiliado"].Value = DBNull.Value;
                                }

                                if (P.foto == null)
                                {
                                    cmd.Parameters["@foto"].Value = DBNull.Value;
                                }
                                else
                                {

                                    // Asignando el valor de la imagen
                                    // Stream usado como buffer
                                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                                    // Se guarda la imagen en el buffer
                                    P.foto.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                                    // Se extraen los bytes del buffer para asignarlos como valor para el parámetro.
                                    cmd.Parameters["@foto"].Value = ms.GetBuffer();
                                }


                                cmd.Transaction = tran;

                                resultado = cmd.ExecuteNonQuery();

                                if (resultado > 0)
                                {

                                    //cargamos que no tiene OS
                                    comando = "update Paciente set tieneOS = @tieneOS where idPersona = @idPersona and nroHC = @nroHC";
                                    SqlCommand sqlcmd = new SqlCommand(comando, con);
                                    sqlcmd.Parameters.Add(new SqlParameter("@tieneOS", false));
                                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", P.idPersona));
                                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", P.nroHC));
                                    sqlcmd.Transaction = tran;
                                    sqlcmd.ExecuteNonQuery();
                                    tran.Commit();
                                }
                            }
                        }

                    }
                }

            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("No se pudo registrar el Paciente", Ex);
            }

            finally
            {

                con.Close();
            }

            return resultado;

        }


        public List<Paciente> obtenerTodosPacientes()
        {
            SqlConnection conexion = DB.Conectar();
            List<Paciente> lista = null;
            try
            {
                SqlCommand sqlPaciente = new SqlCommand("SELECT * FROM Paciente", conexion);
                SqlDataReader drPaciente = sqlPaciente.ExecuteReader();

                lista = new List<Paciente>();
                while (drPaciente.Read())
                {
                    Paciente p = new Paciente();
                    SqlConnection con = DB.Conectar();
                    SqlCommand sqlPersona = new SqlCommand("SELECT nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE codPersona = @idPersona", con);
                    sqlPersona.Parameters.Add(new SqlParameter("@idPersona", drPaciente["idPersona"]));
                    SqlDataReader drPersona = sqlPersona.ExecuteReader();
                    if (drPersona.Read())
                    {
                        if (drPaciente["idPersona"] != DBNull.Value)
                        {
                            p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                            //Como hago con la foto
                            p.Nombre = drPersona["nombre"].ToString();
                            p.Apellido = drPersona["apellido"].ToString();
                            p.CodTipoDoc = Convert.ToInt32(drPersona["tipoDocumento"].ToString());
                            p.NroDocumento = Convert.ToInt32(drPersona["nroDocumento"].ToString());
                            if (drPaciente["foto"] != DBNull.Value)
                            {
                                byte[] imageBuffer = (byte[])(drPaciente["foto"]);
                                System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                                p.foto = Image.FromStream(ms);
                            }
                            lista.Add(p);
                        }
                    }
                    p = null;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                conexion.Close();
            }

            return lista;
        }

        //METODO PARA OBTENER TODOS LOS PACIENTES METODO STATIC //NECESITO EN ESTE METODO EL PLAN DE AFILIACION SI POSEE-
        public static List<Paciente> obtenerPacientes()
        {
            SqlConnection con = DB.Conectar();
            SqlTransaction trans = null;
            Paciente p = null;
            List<Paciente> lp = new List<Paciente>();
            try
            {
                trans = con.BeginTransaction();
                string comando = "select pA.*, p.*, tp.nombre AS nombreTP from Paciente pA, Persona p ,Tipo_Paciente tp where pA.idPersona=p.codPersona and tp.idTipoPaciente=pA.idTipoPaciente and pA.idEstadoPaciente=1";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = DB.GenerarReader(comando, listp, con, trans);
                while (dr.Read())
                {
                    p = new Paciente();
                    p.Nombre = dr["nombre"].ToString();
                    p.Apellido = dr["apellido"].ToString();
                    p.idPersona = long.Parse(dr["codPersona"].ToString());
                    p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                    p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                    p.idTipoPaciente = int.Parse(dr["idTipoPaciente"].ToString());
                    p.nombreTipoPaciente = dr["nombreTP"].ToString();
                    if (dr["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        p.foto = Image.FromStream(ms);
                    }

                    p.nroHC = long.Parse(dr["nroHC"].ToString());
                    if (dr["nroAfiliado"] != DBNull.Value)
                    {
                        long nroAfiliado = long.Parse(dr["nroAfiliado"].ToString());
                        //string comando2 = "SELECT Plan_Afiliacion.idPlan, Plan_Afiliacion.nombre, Afiliacion.nroAfiliado "
                        //            + "FROM Afiliacion INNER JOIN Plan_Afiliacion ON Afiliacion.idPlan = Plan_Afiliacion.idPlan "
                        //            + "WHERE     (Afiliacion.nroAfiliado = @nroAfiliado)";

                        //List<SqlParameter> listp2 = new List<SqlParameter>();
                        //listp2.Add(new SqlParameter("@nroAfiliado", nroAfiliado));
                        //SqlDataReader dr2 = DB.GenerarReader(comando2, listp2, con, trans);

                        //if (dr2.Read())
                        //{
                        //    p.planAfiliado = new PlanAfiliacion();
                        //    p.planAfiliado.idPlan = int.Parse(dr["idPlan"].ToString());
                        //    p.planAfiliado.nombre = dr["nombre"].ToString();
                        //}


                    }
                    lp.Add(p);
                    p = null;
                }



            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                con.Close();
            }

            return lp;
        }

        //Paciente Con Filtros CODTIPODOC;NRODOC,APELL
        public static List<Paciente> buscarConFiltros(int? codTipoDocumento, long? nroDocumento, string apellido)
        {
            List<Paciente> lp = new List<Paciente>();
            Paciente oP = null;
            SqlConnection con = DB.Conectar();
            try
            {
                //tipoDoc y nroDoc y apellido
                string comando = "select pA.*, p.*, tp.nombre AS nombreTP from Paciente pA, Persona p ,Tipo_Paciente tp where pA.idPersona=p.codPersona and tp.idTipoPaciente=pA.idTipoPaciente and Pa.idEstadoPaciente=1";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = null;
                if (codTipoDocumento != null && nroDocumento != null && apellido != null)
                {
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (apellido != null)
                {
                    comando += " and P.apellido=@apellido";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (codTipoDocumento != null && nroDocumento != null)
                {
                    comando += " and P.TipoDocumento=@codTipoDocumento and P.nroDocumento=@nroDocumento";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else
                {
                    dr = DB.GenerarReader(comando, listp, con);
                }
                while (dr.Read())
                {
                    oP = new Paciente();
                    oP.Nombre = dr["nombre"].ToString();
                    oP.Apellido = dr["apellido"].ToString();
                    oP.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oP.nombreTipoPaciente = dr["nombreTP"].ToString();
                    if (dr["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        oP.foto = Image.FromStream(ms);
                    }
                    lp.Add(oP);
                    oP = null;
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {

                con.Close();
            }


            return lp;
        }
        //Paciente con filtros pero con nroHC
        public static List<Paciente> buscarConFiltros2(long? nroHC, int? codTipoDocumento, long? nroDocumento, string apellido)
        {
            List<Paciente> lp = new List<Paciente>();
            Paciente oP = null;
            SqlConnection con = DB.Conectar();
            try
            {
                //tipoDoc y nroDoc y apellido
                string comando = "select pA.*, p.*, tp.nombre AS nombreTP from Paciente pA, Persona p ,Tipo_Paciente tp where pA.idPersona=p.codPersona and tp.idTipoPaciente=pA.idTipoPaciente and Pa.idEstadoPaciente=1";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = null;
                if (codTipoDocumento != null && nroDocumento != null && apellido != null && nroHC != null)
                {
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    listp.Add(new SqlParameter("@apellido", apellido));
                    listp.Add(new SqlParameter("@nroHC", nroHC));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (apellido != null)
                {
                    comando += " and P.apellido=@apellido";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (codTipoDocumento != null && nroDocumento != null)
                {
                    comando += " and P.TipoDocumento=@codTipoDocumento and P.nroDocumento=@nroDocumento";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else if (nroHC != null)
                {
                    comando += " and Pa.nroHC=@nroHC";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@nroHC", nroHC));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else
                {
                    dr = DB.GenerarReader(comando, listp, con);
                }
                while (dr.Read())
                {
                    oP = new Paciente();
                    oP.Nombre = dr["nombre"].ToString();
                    oP.Apellido = dr["apellido"].ToString();
                    oP.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oP.nombreTipoPaciente = dr["nombreTP"].ToString();
                    if (dr["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        oP.foto = Image.FromStream(ms);
                    }
                    lp.Add(oP);
                    oP = null;
                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {

                con.Close();
            }


            return lp;
        }

        public string obtenerTipoDocumento(int codDocumento)
        {
            string res = "";
            SqlConnection con = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT nombre FROM Tipo_Documento WHERE codTipoDoc = @codTipoDoc", con);
            sql.Parameters.Add(new SqlParameter("@codTipoDoc", codDocumento));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                res = dr["nombre"].ToString();
            }
            return res;
        }

        public string obtenerSexo(int codSexo)
        {
            string res = "";
            SqlConnection con = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT nombre FROM Sexo WHERE codSexo = @codSexo", con);
            sql.Parameters.Add(new SqlParameter("@codSexo", codSexo));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                res = dr["nombre"].ToString();
            }
            return res;
        }

        public Paciente buscarConFiltros(int codTipoDocumento, int nroDocumento, string nombre, string apellido, int nroHC)
        {
            Paciente p = new Paciente();
            SqlConnection con = DB.Conectar();

            //Tipo Documento y nroDocumento
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre == "" && apellido == "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != DBNull.Value)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            //Tipo Documento y nroDocumento y nombre
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre != "" && apellido == "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND nombre = @nombre ", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = nombre;
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            //TipoDocumento y nroDocumento y nombre y apellido
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre != "" && apellido != "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND nombre = @nombre AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = nombre;
                        p.Apellido = apellido;
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            //TipoDoc y nroDoc y nombre y apellido y nroHC
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre != "" && apellido != "" && nroHC != 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND nombre = @nombre AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto  FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = nombre;
                        p.Apellido = apellido;
                        p.nroHC = nroHC;
                    }
                }
            }

            //tipoDoc y nroDoc y apellido
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre == "" && apellido != "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = apellido;
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            //tipoDoc y nroDoc y nroHC
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre == "" && apellido == "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto  FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = nroHC;
                    }
                }
            }

            //nombre
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre != "" && apellido == "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE nombre = @nombre", con);
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                SqlDataReader dr = sql.ExecuteReader();
                while (dr.Read())
                {
                    if (dr["codPersona"] != DBNull.Value)
                    {
                        SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                        sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                        SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                        if (drPaciente["nroHC"] != DBNull.Value)
                        {
                            p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                            p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                            p.Nombre = nombre;
                            p.Apellido = dr["apellido"].ToString();
                            p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                        }
                    }
                }
            }

            //nombre y apellido
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre != "" && apellido != "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE nombre = @nombre AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                        p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                        p.Nombre = nombre;
                        p.Apellido = apellido;
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            //nombre y apellido y hc
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre != "" && apellido != "" && nroHC != 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE nombre = @nombre AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                        p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                        p.Nombre = nombre;
                        p.Apellido = apellido;
                        p.nroHC = nroHC;
                    }
                }
            }

            //apellido y hc
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre == "" && apellido != "" && nroHC != 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                        p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = apellido;
                        p.nroHC = nroHC;
                    }
                }
            }

            //TipoDoc y nroDoc y apellido y hc
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre == "" && apellido != "" && nroHC != 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = nombre;
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = nroHC;
                    }
                }
            }

            //tipoDoc y nroDoc y nombre y hc
            if (codTipoDocumento != 0 && nroDocumento != 0 && nombre != "" && apellido == "" && nroHC != 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE tipoDocumento = @codTipoDocumento AND nroDocumento = @nroDocumento AND nombre = @nombre", con);
                sql.Parameters.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                sql.Parameters.Add(new SqlParameter("@nroDocumento", nroDocumento));
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona AND nroHC = @nroHC", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = codTipoDocumento;
                        p.NroDocumento = nroDocumento;
                        p.Nombre = nombre;
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = nroHC;
                    }
                }
            }

            //nroHC
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre == "" && apellido == "" && nroHC != 0)
            {
                SqlCommand sqlcmd = new SqlCommand("SELECT  foto, idPersona FROM Paciente WHERE nroHC = @nroHC", con);
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                if (drPaciente["idPersona"] != DBNull.Value)
                {
                    SqlCommand sql = new SqlCommand("SELECT  nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE codPersona = @idPersona", con);
                    sql.Parameters.Add(new SqlParameter("@idPersona", drPaciente["idPersona"]));
                    SqlDataReader dr = sql.ExecuteReader();
                    if (dr["nombre"] != null)
                    {
                        p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                        p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString()); ;
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = dr["apellido"].ToString();
                        p.nroHC = nroHC;
                    }
                }
            }

            //apellido
            if (codTipoDocumento == 0 && nroDocumento == 0 && nombre == "" && apellido != "" && nroHC == 0)
            {
                SqlCommand sql = new SqlCommand("SELECT  codPersona, nombre, apellido, tipoDocumento, nroDocumento FROM Persona WHERE apellido = @apellido", con);
                sql.Parameters.Add(new SqlParameter("@apellido", apellido));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr["codPersona"] != null)
                {
                    SqlCommand sqlcmd = new SqlCommand("SELECT  foto, nroHC FROM Paciente WHERE idPersona = @idPersona", con);
                    sqlcmd.Parameters.Add(new SqlParameter("@idPersona", dr["codPersona"]));
                    SqlDataReader drPaciente = sqlcmd.ExecuteReader();
                    if (drPaciente["nroHC"] != DBNull.Value)
                    {
                        p.CodTipoDoc = Convert.ToInt32(dr["tipoDocumento"].ToString());
                        p.NroDocumento = Convert.ToInt32(dr["nroDocumento"].ToString());
                        p.Nombre = dr["nombre"].ToString();
                        p.Apellido = apellido;
                        p.nroHC = Convert.ToInt32(drPaciente["nroHC"].ToString());
                    }
                }
            }

            return p;
        }

        public Paciente buscarPaciente(long nroHC)
        {
            Paciente p = new Paciente();
            SqlConnection conPaciente = DB.Conectar();
            SqlCommand sqlPaciente = new SqlCommand("SELECT * FROM Paciente WHERE nroHC = @nroHC", conPaciente);
            sqlPaciente.Parameters.Add(new SqlParameter("@nroHC", nroHC));
            SqlDataReader drPaciente = sqlPaciente.ExecuteReader();
            if (drPaciente.Read())
            {
                SqlConnection conPersona = DB.Conectar();
                SqlCommand sqlPersona = new SqlCommand("SELECT * FROM Persona WHERE codPersona = @codPersona", conPersona);
                sqlPersona.Parameters.Add(new SqlParameter("@codPersona", drPaciente["idPersona"]));
                SqlDataReader drPersona = sqlPersona.ExecuteReader();

                if (drPersona.Read())
                {
                    p.idPersona = Convert.ToInt32(drPersona["codPersona"].ToString());
                    p.Nombre = drPersona["nombre"].ToString();
                    p.Apellido = drPersona["apellido"].ToString();
                    p.CodTipoDoc = Convert.ToInt32(drPersona["tipoDocumento"].ToString());
                    p.NroDocumento = Convert.ToInt64(drPersona["nroDocumento"].ToString());
                    if (drPersona["telefono"] != DBNull.Value)
                    {
                        p.Telefono = long.Parse(drPersona["telefono"].ToString());
                    }
                    else
                    {
                        p.Telefono = null;
                    }
                    if (drPersona["celular"] != DBNull.Value)
                    {
                        p.Celular = long.Parse(drPersona["celular"].ToString());
                    }
                    else
                    {
                        p.Celular = null;
                    }
                    if (drPersona["mail"] != DBNull.Value)
                    {
                        p.Mail = drPersona["mail"].ToString();
                    }
                    else
                    {
                        p.Mail = null;
                    }
                    p.CodSexo = Convert.ToInt32(drPersona["sexo"].ToString());
                    if (drPersona["fechaNacimiento"] != DBNull.Value)
                    {
                        p.FechaNacimiento = Convert.ToDateTime(drPersona["fechaNacimiento"].ToString());
                    }
                    else
                    {
                        p.FechaNacimiento = null;
                    }
                    p.nroHC = nroHC;
                    p.idDomicilio = Convert.ToInt32(drPaciente["idDomicilio"].ToString());
                    p.idEstadoPaciente = Convert.ToInt32(drPaciente["idEstadoPaciente"].ToString());
                    p.idTipoPaciente = Convert.ToInt32(drPaciente["idTipoPaciente"].ToString());
                    if (drPaciente["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(drPaciente["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        p.foto = Image.FromStream(ms);
                    }
                }
            }

            return p;
        }

        public Domicilio obtenerDomicilio(int idDocimilio)
        {
            Domicilio d = new Domicilio();
            SqlConnection con = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT  * FROM Domicilio WHERE idDomicilio = @idDomicilio", con);
            sql.Parameters.Add(new SqlParameter("@idDomicilio", idDocimilio));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                d.idDomicilio = idDocimilio;
                d.calle = dr["calle"].ToString();
                d.numero = Convert.ToInt32(dr["numero"].ToString());
                if (dr["piso"] != DBNull.Value)
                {
                    d.piso = Convert.ToInt32(dr["piso"].ToString());
                }
                else
                {
                    d.piso = null;
                }
                if (dr["departamento"] != DBNull.Value)
                {
                    d.Departamento = dr["departamento"].ToString();
                }
                else
                {
                    d.Departamento = null;
                }

                d.idBarrio = Convert.ToInt32(dr["idBarrio"].ToString());
                if (dr["codigoPostal"] != DBNull.Value)
                {
                    d.codPostal = Convert.ToInt32(dr["codigoPostal"].ToString());
                }
                else
                {
                    d.codPostal = null;
                }
            }
            return d;
        }

        public Barrio obtenerLocalidad(int idBarrio)
        {
            Barrio b = new Barrio();
            SqlConnection con = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT  * FROM Barrio WHERE idBarrio = @idBarrio", con);
            sql.Parameters.Add(new SqlParameter("@idBarrio", idBarrio));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                b.idLocalidad = Convert.ToInt32(dr["idLocalidad"].ToString());
                b.nombre = dr["nombre"].ToString();
            }
            return b;
        }

        public string obtenerNombreLocalidad(int idLocalidad)
        {
            string res = "";
            SqlConnection con = DB.Conectar();
            SqlCommand sql = new SqlCommand("SELECT  * FROM Localidad WHERE idLocalidad = @idLocalidad", con);
            sql.Parameters.Add(new SqlParameter("@idLocalidad", idLocalidad));
            SqlDataReader dr = sql.ExecuteReader();
            if (dr.Read())
            {
                res = dr["nombre"].ToString();
            }
            return res;
        }

        public List<ObraSocialXPaciente> obtenerOSdePaciente(long nroHc)
        {
            List<ObraSocialXPaciente> list = new List<ObraSocialXPaciente>();
            ObraSocialXPaciente obs = new ObraSocialXPaciente();
            SqlConnection con = DB.Conectar();
            try
            {
                SqlCommand sql = new SqlCommand("SELECT  * FROM ObraSocialXPaciente WHERE nroHCpaciente = @nroHC", con);
                sql.Parameters.Add(new SqlParameter("@nroHC", nroHc));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        obs = new ObraSocialXPaciente();
                        obs.nroHCPaciente = nroHc;
                        obs.idPaciente = long.Parse(dr["idPersonaPaciente"].ToString());
                        obs.idObraSocial = Convert.ToInt32(dr["idObraSocial"].ToString());
                        obs.nroAfiliado = long.Parse(dr["nroAfiliadoOS"].ToString());
                        list.Add(obs);
                        obs = null;
                    }
                    return list;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {

                throw;
            }

            finally
            {
                con.Close();
            }
        }

        public int modificarPaciente(Paciente P, Domicilio oD, List<ObraSocialXPaciente> ListoSxP, List<ObraSocialXPaciente> listEsliminar)
        {

            int resultado = 0;
            SqlConnection con = null;
            SqlTransaction tran = null;
            con = DB.Conectar();
            try
            {
                tran = con.BeginTransaction();
                SqlConnection con2 = DB.Conectar();
                //BUSCAMOS EL IDPERSONA Y IDBARRIO
                SqlCommand sqlPaciente = new SqlCommand("SELECT idPersona, idDomicilio FROM Paciente WHERE nroHC = @nroHC", con2);
                sqlPaciente.Parameters.Add(new SqlParameter("@nroHC", P.nroHC));
                SqlDataReader drPaciente = sqlPaciente.ExecuteReader();

                //MODIFICAR PERSONA
                if (drPaciente.Read())
                {
                    string comando = "UPDATE Persona SET nombre = @nombre, apellido = @apellido, tipoDocumento = @tipoDocumento, nroDocumento = @nroDocumento, telefono = @telefono, celular = @celular, mail = @mail, sexo = @sexo, fechaNacimiento = @fechaNacimiento WHERE codPersona = @idPersona ";
                    List<SqlParameter> listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@idPersona", drPaciente["idPersona"]));
                    listp.Add(new SqlParameter("@nombre", P.Nombre));
                    listp.Add(new SqlParameter("@apellido", P.Apellido));
                    listp.Add(new SqlParameter("@tipoDocumento", P.CodTipoDoc));
                    listp.Add(new SqlParameter("@nroDocumento", P.NroDocumento));
                    listp.Add(new SqlParameter("@fechaNacimiento", P.FechaNacimiento));
                    listp.Add(new SqlParameter("@sexo", P.CodSexo));

                    //PARAMETROS QUE PUEDEN RECIBIR NULL

                    if (P.Telefono == null)
                    {
                        listp.Add(new SqlParameter("@telefono", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@telefono", P.Telefono));
                    }

                    if (P.Celular == null)
                    {
                        listp.Add(new SqlParameter("@celular", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@celular", P.Celular));
                    }
                    if (P.Mail == null)
                    {
                        listp.Add(new SqlParameter("@mail", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@mail", P.Mail));
                    }

                    resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    if (resultado > 0)
                    {
                        //modifcar foto
                        comando = "UPDATE Paciente SET foto = @foto WHERE nroHC = @nroHC";
                        SqlCommand cmd = new System.Data.SqlClient.SqlCommand(comando, con);

                        cmd.Parameters.Add("@nroHC", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@foto", System.Data.SqlDbType.Image);

                        cmd.Parameters["@nroHC"].Value = P.nroHC;
                        // Asignando el valor de la imagen
                        // Stream usado como buffer
                        System.IO.MemoryStream ms = new System.IO.MemoryStream();
                        // Se guarda la imagen en el buffer
                        P.foto.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        // Se extraen los bytes del buffer para asignarlos como valor para el parámetro.
                        cmd.Parameters["@foto"].Value = ms.GetBuffer();

                        cmd.Transaction = tran;

                        resultado = cmd.ExecuteNonQuery();
                    }

                    if (resultado > 0)
                    {
                        //MODIFICAR DOMICILIO
                        comando = "UPDATE Domicilio SET calle = @calle, numero = @numero, idBarrio = @idBarrio, piso = @piso, departamento = @departamento, codigoPostal = @codigoPostal WHERE idDomicilio = @idDomicilio ";
                        listp = null;
                        listp = new List<SqlParameter>();
                        listp.Add(new SqlParameter("@idDomicilio", drPaciente["idDomicilio"]));
                        listp.Add(new SqlParameter("@calle", oD.calle));
                        listp.Add(new SqlParameter("@numero", oD.numero));
                        listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                        if (oD.piso == null)
                        {
                            listp.Add(new SqlParameter("@Piso", DBNull.Value));
                        }
                        else
                        {
                            listp.Add(new SqlParameter("@Piso", oD.piso));
                        }
                        if (oD.Departamento == null)
                        {
                            listp.Add(new SqlParameter("@departamento", DBNull.Value));
                        }
                        else
                        {
                            listp.Add(new SqlParameter("@departamento", oD.Departamento));

                        }
                        if (oD.codPostal == null)
                        {
                            listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                        }
                        else
                        {
                            listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                        }
                        resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    }
                    if (resultado > 0)
                    {
                        if (ListoSxP.Count > 0)
                        {
                            comando = "insert into ObraSocialXPaciente(nroHCpaciente,idPersonaPaciente,idObraSocial,nroAfiliadoOS)values(@nroHCpaciente,@idPersonaPaciente,@idObraSocial,@nroAfiliadoOS)";
                            foreach (ObraSocialXPaciente item in ListoSxP)
                            {

                                listp = new List<SqlParameter>();
                                listp.Add(new SqlParameter("@nroHCpaciente", P.nroHC));
                                listp.Add(new SqlParameter("@idPersonaPaciente", drPaciente["idPersona"]));
                                listp.Add(new SqlParameter("@idObraSocial", item.idObraSocial));
                                listp.Add(new SqlParameter("@nroAfiliadoOS", item.nroAfiliado));

                                resultado = DB.EjecutarCommand(comando, listp, con, tran);

                                listp = null;
                            }
                            if (resultado > 0 && listEsliminar.Count == 0)
                            {
                                tran.Commit();
                            }
                        }

                        if (listEsliminar.Count > 0)
                        {
                            SqlConnection conn = DB.Conectar();
                            foreach (ObraSocialXPaciente item in listEsliminar)
                            {
                                SqlCommand sql = new SqlCommand("DELETE FROM ObraSocialXPaciente WHERE nroHCpaciente = @nroHCpaciente AND idPersonaPaciente = @idPersonaPaciente AND idObraSocial = @idObraSocial AND nroAfiliadoOS = @nroAfiliadoOS", conn);
                                sql.Parameters.Add(new SqlParameter("@nroHCpaciente", item.nroHCPaciente)); ;
                                sql.Parameters.Add(new SqlParameter("@idPersonaPaciente", item.idPaciente));
                                sql.Parameters.Add(new SqlParameter("@idObraSocial", item.idObraSocial));
                                sql.Parameters.Add(new SqlParameter("@nroAfiliadoOS", item.nroAfiliado));
                                resultado = sql.ExecuteNonQuery();
                            }
                            if (resultado > 0)
                            {
                                tran.Commit();
                            }
                        }
                        else
                        {
                            tran.Commit();
                        }
                    }

                }
            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }
                throw new Exception("No se pudo modificar el Paciente", Ex);
            }

            finally
            {

                con.Close();
            }

            return resultado;

        }

        public Boolean eliminarObraSocialXPaciente(long nroHC, List<ObraSocialXPaciente> lis)
        {
            SqlConnection conPaciente = DB.Conectar();
            try
            {
                SqlCommand sqlPaciente = new SqlCommand("SELECT idPersona FROM Paciente WHERE nroHC = @nroHC", conPaciente);
                sqlPaciente.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                SqlDataReader drPaciente = sqlPaciente.ExecuteReader();
                if (drPaciente.Read())
                {
                    if (lis.Count > 0)
                    {
                        foreach (ObraSocialXPaciente item in lis)
                        {
                            SqlConnection con = DB.Conectar();
                            SqlCommand sql = new SqlCommand("DELETE FROM ObraSocialXPaciente WHERE nroHCpaciente = @nroHCpaciente AND idPersonaPaciente = @idPersonaPaciente AND idObraSocial = @idObraSocial AND nroAfiliadoOS = @nroAfiliadoOS", con);
                            sql.Parameters.Add(new SqlParameter("@nroHCpaciente", item.nroHCPaciente)); ;
                            sql.Parameters.Add(new SqlParameter("@idPersonaPaciente", item.idPaciente));
                            sql.Parameters.Add(new SqlParameter("@idObraSocial", item.idObraSocial));
                            sql.Parameters.Add(new SqlParameter("@nroAfiliadoOS", item.nroAfiliado));
                            sql.ExecuteNonQuery();
                        }
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {

                throw;
            }

            finally
            {
                conPaciente.Close();
            }
        }

        public ObraSocial nombreOS(int idObraSocial)
        {
            ObraSocial os = null;
            SqlConnection con = DB.Conectar();
            try
            {
                SqlCommand sql = new SqlCommand("SELECT  * FROM Obra_Social WHERE idObraSocial = @idObraSocial", con);
                sql.Parameters.Add(new SqlParameter("@idObraSocial", idObraSocial));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.Read())
                {
                    os = new ObraSocial();
                    os.nombre = dr["nombreObraSocial"].ToString();
                    os.siglas = dr["siglasOS"].ToString();
                }
            }
            catch (Exception)
            {

                throw;
            }

            finally
            {
                con.Close();
            }
            return os;
        }

        public int obteneridOS(string nombre, string siglas)
        {
            int os = 0;
            SqlConnection con = DB.Conectar();
            try
            {
                SqlCommand sql = new SqlCommand("SELECT  idObraSocial FROM Obra_Social WHERE nombreObraSocial = @nombre AND siglasOS = @siglas", con);
                sql.Parameters.Add(new SqlParameter("@nombre", nombre));
                sql.Parameters.Add(new SqlParameter("@siglas", siglas));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.Read())
                {
                    os = Convert.ToInt32(dr["idObraSocial"].ToString());
                    return os;
                }
            }
            catch (Exception ex)
            {

                throw;
            }

            finally
            {
                con.Close();
            }
            return os;
        }

        public string obtenerEstadoPaciente(int idEstado)
        {
            string res = "";
            SqlConnection con = DB.Conectar();
            try
            {
                SqlCommand sql = new SqlCommand("SELECT  * FROM Estado_Paciente WHERE idEstadoPaciente = @idEstado", con);
                sql.Parameters.Add(new SqlParameter("@idEstado", idEstado));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.Read())
                {
                    res = dr["nombre"].ToString();
                }
            }
            catch (Exception ex)
            {

                throw;
            }

            finally
            {
                con.Close();
            }
            return res;
        }

        public string obtenerTipoPaciente(int idTipoPaciente)
        {
            string res = "";
            SqlConnection con = DB.Conectar();
            try
            {
                SqlCommand sql = new SqlCommand("SELECT  * FROM Tipo_Paciente WHERE idTipoPaciente = @idTipo", con);
                sql.Parameters.Add(new SqlParameter("@idTipo", idTipoPaciente));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.Read())
                {
                    res = dr["nombre"].ToString();
                }
            }
            catch (Exception)
            {

                throw;
            }

            finally
            {
                con.Close();
            }
            return res;
        }

        public List<Paciente> buscarConFiltros2(int? codTipoDocumento, long? nroDocumento, string apellido)
        {
            List<Paciente> lp = new List<Paciente>();
            Paciente oP = null;
            SqlConnection con = DB.Conectar();
            try
            {
                //tipoDoc y nroDoc y apellido
                string comando = "SELECT pa.*, pe.* FROM Paciente pa, Persona pe WHERE ";
                List<SqlParameter> listp = new List<SqlParameter>();
                SqlDataReader dr = null;
                if (codTipoDocumento > 0 && nroDocumento != 0 & apellido != "")
                {
                    comando += "pe.TipoDocumento = @codTipoDocumento AND pe.nroDocumento = @nroDocumento AND pe.apellido LIKE  '" + @apellido + "%' AND pe.codPersona = pa.idPersona";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (codTipoDocumento == 0 && nroDocumento == 0 && apellido != "")
                {
                    comando += " pe.apellido LIKE '" + @apellido + "%' AND pe.codPersona = pa.idPersona";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@apellido", apellido));
                    dr = DB.GenerarReader(comando, listp, con);

                }
                else if (codTipoDocumento > 0 && nroDocumento != 0 && apellido == "")
                {
                    comando += "pe.TipoDocumento = @codTipoDocumento AND pe.nroDocumento = @nroDocumento AND pe.codPersona = pa.idPersona";
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@codTipoDocumento", codTipoDocumento));
                    listp.Add(new SqlParameter("@nroDocumento", nroDocumento));
                    dr = DB.GenerarReader(comando, listp, con);
                }
                else
                {
                    dr = DB.GenerarReader(comando, listp, con);
                }
                while (dr.Read())
                {
                    oP = new Paciente();
                    oP.Nombre = dr["nombre"].ToString();
                    oP.Apellido = dr["apellido"].ToString();
                    oP.CodTipoDoc = Convert.ToInt32(dr["TipoDocumento"].ToString());
                    oP.NroDocumento = long.Parse(dr["nroDocumento"].ToString());
                    oP.nroHC = long.Parse(dr["nroHC"].ToString());
                    if (dr["foto"] != DBNull.Value)
                    {
                        byte[] imageBuffer = (byte[])(dr["foto"]);
                        System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                        oP.foto = Image.FromStream(ms);
                    }
                    lp.Add(oP);
                    oP = null;

                }

            }
            catch (Exception)
            {

                throw;
            }
            finally
            {

                con.Close();
            }
            return lp;
        }

        //barby - usado en cobro atencion medica
        //este metodo me retorna todas las OS del paciente, con su nombre, validando que tengan convenio vigente, sino no las trae.
        //retorna null -> si no hay nada; list<> -> si encontró algo
        public static List<ObraSocialXPaciente> obtenerOSPaciente(long nroHc)
        {
            List<ObraSocialXPaciente> list = null;

            SqlConnection con = DB.Conectar();
            try
            {
                string comando = "SELECT ObraSocialXPaciente.nroHCpaciente, ObraSocialXPaciente.idPersonaPaciente, ObraSocialXPaciente.idObraSocial, ObraSocialXPaciente.nroAfiliadoOS, Obra_Social.nombreObraSocial "
                                   + "FROM ObraSocialXPaciente INNER JOIN Obra_Social ON ObraSocialXPaciente.idObraSocial = Obra_Social.idObraSocial "
                                   + "WHERE (ObraSocialXPaciente.nroHCpaciente = @nroHC) AND (Obra_Social.tieneConvVigente = 1)";
                SqlCommand sql = new SqlCommand(comando, con);
                sql.Parameters.Add(new SqlParameter("@nroHC", nroHc));
                SqlDataReader dr = sql.ExecuteReader();
                if (dr.HasRows)
                {
                    list = new List<ObraSocialXPaciente>();
                    ObraSocialXPaciente osPac = null;
                    while (dr.Read())
                    {
                        osPac = new ObraSocialXPaciente();
                        osPac.nroHCPaciente = long.Parse(dr["nroHCpaciente"].ToString());
                        osPac.idPaciente = long.Parse(dr["idPersonaPaciente"].ToString());
                        osPac.idObraSocial = Convert.ToInt32(dr["idObraSocial"].ToString());
                        osPac.nroAfiliado = long.Parse(dr["nroAfiliadoOS"].ToString());
                        osPac.NombreOS = dr["nombreObraSocial"].ToString();
                        list.Add(osPac);
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                con.Close();
            }
            return list;
        }

        //barby
        public long obtenerCelularPaciente(long nroHC)
        {
            long nroCel = 0;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT Paciente.nroHC, Paciente.idPersona, Persona.celular " +
                                 "FROM Paciente INNER JOIN Persona ON Paciente.idPersona = Persona.codPersona " +
                                 "WHERE (Paciente.nroHC = @nroHC)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@nroHC", nroHC));
                SqlDataReader dr = sqlcmd.ExecuteReader();
                while (dr.Read())
                {
                    if (dr["celular"] != DBNull.Value)
                        nroCel = long.Parse(dr["celular"].ToString());
                }
            }
            catch (Exception ex)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return nroCel;
        }

        public static Paciente buscarPacientePorNroAfilaidoWEB(long nroAfiliado)
        {
            Paciente p = new Paciente();
            SqlConnection conPaciente = DB.Conectar();
            string comando = "SELECT     Afiliado.nroAfiliado, Paciente.nroHC,Paciente.idEstadoPaciente,Paciente.foto,Paciente.idTipoPaciente, Paciente.idPersona, Paciente.idDomicilio, Persona.codPersona, Persona.nombre, Persona.apellido, Persona.tipoDocumento, Persona.nroDocumento, "
                      + "Persona.telefono, Persona.celular, Persona.mail, Persona.sexo, Persona.fechaNacimiento, Domicilio.calle, Domicilio.numero, Domicilio.piso, Domicilio.departamento, Domicilio.idBarrio, "
                      + "Domicilio.codigoPostal, Barrio.nombre AS nombreBarrio "
                      + "FROM         Afiliado INNER JOIN "
                      + "Paciente ON Afiliado.nroHCpaciente = Paciente.nroHC AND Afiliado.idPersonaPaciente = Paciente.idPersona AND Afiliado.nroAfiliado = Paciente.nroAfiliado INNER JOIN "
                      + "Persona ON Afiliado.idPersonaPaciente = Persona.codPersona AND Paciente.idPersona = Persona.codPersona INNER JOIN "
                      + "Domicilio ON Paciente.idDomicilio = Domicilio.idDomicilio INNER JOIN "
                      + "Barrio ON Domicilio.idBarrio = Barrio.idBarrio "
                      + "WHERE     (Afiliado.nroAfiliado = @nroAf)";
            SqlCommand sqlPaciente = new SqlCommand(comando, conPaciente);
            sqlPaciente.Parameters.Add(new SqlParameter("@nroAf", nroAfiliado));
            SqlDataReader drPaciente = sqlPaciente.ExecuteReader();

            if (drPaciente.Read())
            {


                p.nroHC = long.Parse(drPaciente["nroHC"].ToString());
                p.idPersona = Convert.ToInt32(drPaciente["idPersona"].ToString());
                p.Nombre = drPaciente["nombre"].ToString();
                p.Apellido = drPaciente["apellido"].ToString();
                p.CodTipoDoc = Convert.ToInt32(drPaciente["tipoDocumento"].ToString());
                p.NroDocumento = Convert.ToInt64(drPaciente["nroDocumento"].ToString());
                if (drPaciente["telefono"] != DBNull.Value)
                {
                    p.Telefono = long.Parse(drPaciente["telefono"].ToString());
                }
                else
                {
                    p.Telefono = null;
                }
                if (drPaciente["celular"] != DBNull.Value)
                {
                    p.Celular = long.Parse(drPaciente["celular"].ToString());
                }
                else
                {
                    p.Celular = null;
                }
                if (drPaciente["mail"] != DBNull.Value)
                {
                    p.Mail = drPaciente["mail"].ToString();
                }
                else
                {
                    p.Mail = null;
                }
                p.CodSexo = Convert.ToInt32(drPaciente["sexo"].ToString());
                if (drPaciente["fechaNacimiento"] != DBNull.Value)
                {
                    p.FechaNacimiento = Convert.ToDateTime(drPaciente["fechaNacimiento"].ToString());
                }
                else
                {
                    p.FechaNacimiento = null;
                }

                p.idDomicilio = Convert.ToInt32(drPaciente["idDomicilio"].ToString());
                p.idEstadoPaciente = Convert.ToInt32(drPaciente["idEstadoPaciente"].ToString());
                p.idTipoPaciente = Convert.ToInt32(drPaciente["idTipoPaciente"].ToString());
                if (drPaciente["foto"] != DBNull.Value)
                {
                    byte[] imageBuffer = (byte[])(drPaciente["foto"]);
                    System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
                    p.foto = Image.FromStream(ms);
                }

            }

            return p;
        }

        public bool nroDocExistente(int tipoDoc, long nroDoc)
        {
            bool res = false;
            SqlConnection con = DB.Conectar();

            try
            {
                string comando = "SELECT * FROM Persona WHERE tipoDocumento=@tipoDoc AND nroDocumento=@nroDoc";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nroDoc", nroDoc));
                listp.Add(new SqlParameter("@tipoDoc", tipoDoc));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    res = true;
                }
            }
            catch (Exception Ex)
            {

                throw new Exception("Error al registrar el paciente: " + Ex.Message);
            }
            finally
            {
                con.Close();

            }
            return res;

        }

    }
}
